package Persistencia;


import java.awt.List;
import java.sql.*;
import java.util.LinkedList;
import java.util.Vector;

public class AgenteBD {
    //instancia del agente
    protected static AgenteBD mInstancia=null;
    //Conexion con la base de datos
    protected static Connection mBD;
    //Identificador ODBC de la base de datos
    private static String url="jdbc:odbc:BD_Biblio";
    //Driven para conectar con bases de datos Microsoft Access 
    private static String driver="sun.jdbc.odbc.JdbcOdbcDriver";
    
    //Constructor
    private AgenteBD()throws Exception {
    	conectar();
    		
    }
    
    //Implementacion del patron singleton
    //Este patron de dise�o permite implementar clases de las cuales
    //solo existir una instancia
    //http://es.wikipedia.org/wiki/Singleton
     public static AgenteBD getAgente() throws Exception{
          if (mInstancia==null){
          mInstancia=new AgenteBD();
        }
        return mInstancia;
     }
 
    //Metodo para realizar la conexion a la base de datos 
    private void conectar() throws Exception {
         Class.forName(driver);
         mBD=DriverManager.getConnection(url);
    }

    
    //Metodo para desconectar de la base de datos
    public void desconectar() throws Exception{
    	mBD.close();
    }

    //Metodo para realizar una insercion en la base de datos
    public int insert(String SQL) throws SQLException, Exception{ 
     	conectar();
    	PreparedStatement stmt = mBD.prepareStatement(SQL);
    	int res=stmt.executeUpdate();
    	stmt.close();
    	desconectar();
    	return res;
    }
    
    //Metodo para realizar una eliminacion en la base de datos
    public int delete(String SQL) throws SQLException,Exception{
    	PreparedStatement stmt = mBD.prepareStatement(SQL);
    	int res=stmt.executeUpdate();
    	stmt.close();
    	desconectar();
    	return res;
    }
    
    //Metodo para realizar una eliminacion en la base de datos
    public int update(String SQL) throws SQLException,Exception{
    	conectar();
    	PreparedStatement stmt = mBD.prepareStatement(SQL);
    	int res=stmt.executeUpdate();
    	stmt.close();
    	desconectar();
    	return res;
    }
    
    
	public Vector<Object> selectUser(String SQL) throws SQLException,Exception{
            conectar();
            Vector<Object> v = new Vector(1,1);
            Vector<Object> datos = new Vector (1,1);
            ResultSet resultado;
            Statement stmt = mBD.createStatement();   
            AgenteBD a = new AgenteBD();
            resultado = stmt.executeQuery(SQL);
            while (resultado.next()){
            	System.out.println(resultado);
                String tipo = resultado.getString("tipo");
                datos.addElement(tipo);
                v.addElement(datos);
            }
            return v;
	}
	
	public Vector<Object> selectBook(String SQL) throws SQLException,Exception{
        conectar();
        Vector<Object> v = new Vector(1,1);
        Vector<Object> datos = new Vector (1,1);
        ResultSet resultado;
        Statement stmt = mBD.createStatement();   
        AgenteBD a = new AgenteBD();
        resultado = stmt.executeQuery(SQL);
        while (resultado.next()){
            String titulo = resultado.getString("titulo");
            datos.addElement(titulo);
            String autor = resultado.getString("autor");
            datos.addElement(autor);
            String signatura = resultado.getString("signatura");
            datos.addElement(signatura);
            String ISBN = resultado.getString("isbn");
            datos.addElement(ISBN);
            int disponibilidad = resultado.getInt("disponibilidad");
            datos.addElement(disponibilidad);
            v.addElement(datos);
        }
        return v;
	}

	public Vector<Object> selectPrestamo(String SQL) throws SQLException,Exception{
        conectar();
        Vector<Object> v = new Vector(1,1);
        Vector<Object> datos = new Vector (1,1);
        ResultSet resultado;
        Statement stmt = mBD.createStatement();   
        AgenteBD a = new AgenteBD();
        resultado = stmt.executeQuery(SQL);
        while (resultado.next()){
            String usuario = resultado.getString("usuario");
            datos.addElement(usuario);
            String dias = resultado.getString("dias");
            datos.addElement(dias);
            String isbn = resultado.getString("isbn");
            datos.addElement(isbn);
            v.addElement(datos);
        }
        return v;
	}
}